<?php
/*
 * uri路由类 Router
 *
 * 由此类对需求的uri进行解析并返回正确的路径或页面
 */

class Router {
	public function getUri($requestUri) {
		$baseDir = trim(BASEDIR, '/');
		$controller = '';
		$params = array();
		//如果访问的uri就是框架根目录则直接设置指向主页
		if(trim(trim($requestUri, '/'), '\\') == $baseDir) {
			return array('controller' => getConfigItem('homePage'), 'params' => array());
		}
		//判断是否项目目录是根目录
		if(trim(trim(trim($baseDir, '/'), '\\'), ' ') == '') {
			$requestUri = ltrim($requestUri, '/');
		}
		else {
			//不是在根目录则追加文件夹路径
			$requestUri = ltrim(substr($requestUri, 2 + strlen($baseDir), strlen($requestUri)), '/');
		}
		//如果uri只存在控制器则需要在后面补充斜杠来为下面的分割做好准备，否则将得到一个空udri
		$requestUri = rtrim($requestUri, '/') . '/';
		$controller = substr($requestUri, 0, strpos($requestUri, '/'));
		$uriStr = trim(substr($requestUri, strlen($controller), strlen($requestUri)), '/');
		$params = explode('/', $uriStr);
		if($controller == 'Files') {
			$this->fileHandler($params);
		}
		return array('controller' => $controller, 'params' => $params);
	}

	private function fileHandler($uri) {
		if(isset($uri[0]) && $uri[0] == 'JsData') {
			$jsData = getSession('jsData');
			header('content-type: text/javascript');
			//如果数据为空则输出js代码params = null，否则params = 进行json格式化的字符串
			if(is_null($jsData)) {
				echo 'var params = null;';
			}
			else {
				echo 'var params = ' . json_encode($jsData) . ';';
			}
			delSession('jsData');
			return;
		}
		if(!isset($uri[0], $uri[1])) {
			showError('error', '文件控制器提示', '提供的参数不正确，无法找到文件');
		}
		//盗链检测
		if(!isResAllow()) {
			_log('此次ip访问为盗链行为');
			showError('error', '防盗链工具提示', '系统内核已经阻止此盗链行为，请勿盗链，谢谢合作', 403);
		}
		$infoTemp = array();
		$filePath = '';
		$fileInfo = getConfigItem('fileInfo');
		$fileType = $uri[0];
		$fileName = $uri[1];
		//遍历获取到当前请求文件类型的文件类型信息
		foreach($fileInfo as $type => $info) {
			if($type == $fileType) {
				foreach($info as $infoName => $infoVal) {
					$infoTemp[$infoName] = $infoVal;
				}
				break;
			}
		}
		$fileMime = $infoTemp['mime'];
		//根据文件类型信息组合出对应的分类文件目录
		$filePath = PUBSPATH . $infoTemp['path'] . $fileName . '.' . $infoTemp['suffix'];
		//获取配置文件中的远程文件链接
		$resLink = getConfigItem('resLink');
		//如果对应路径下没有找到该文件就从配置文件中的链接中寻找，再找不到就输出错误
		if(!file_exists($filePath)) {
			if(isset($resLink[$fileType][$fileName])) {
				setStatus(203);
				$filePath = $resLink[$fileType][$fileName];
			}
			else {
				_log('找不到' . $filePath);
				showError('error', '找不到指定文件', '从请求中所解析的路径是无效的，无法找到该文件', 404);
			}
		}
		//文件数据输出
		$fileBuffer = file_get_contents($filePath);
		header('content-type: ' . $fileMime);
		echo $fileBuffer;
		exit(0);
	}
}